package com.leetcode;

public class AddBinary
{

	public String addBinary(String a, String b)
	{
		// Start typing your Java solution below
		// DO NOT write main() function
		if ("".equals(a) || "0".equals(a))
		{// 一个为0或者为空的情况
			return ("".equals(b)) ? "0" : b;
		}
		if ("".equals(b) || "0".equals(b))
		{
			return ("".equals(a)) ? "0" : a;
		}
		if (a.equals(b))
		{// 两个相等直接左移
			return (a + "0");
		}
		int llength = a.length();
		int slength = b.length();// 感觉这两个变量应该优化的
		StringBuffer sb = new StringBuffer();
		char[] achars = null;// 命名有问题，其实代表最长
		char[] bchars = null;
		if (llength >= slength)
		{
			achars = a.toCharArray();
			bchars = b.toCharArray();
		}
		else
		{
			achars = b.toCharArray();
			bchars = a.toCharArray();
		}
		char c = '0';// 因为开始时放在for里面，导致忽略了c是char而声明成了int出了不少错
		for (int i = achars.length - 1, j = bchars.length - 1; i >= -1; i--)
		{// 考虑最后进位
			if (j > -1)
			{// 一长一短，短的没遍历完前
				if (achars[i] == bchars[j])
				{// 两个数相等，必然要么进1要么不进，结果取决于进位值
					sb.append(c);
					c = achars[i];// 既然相等，那都为1时必然进位
				}
				else
				{
					sb.append(c == '0' ? '1' : '0');// 不相等时，肯定是有个1的，然后跟进位想加，所以结果取决于c，而进位不变
				}
				j--;
			}
			else if (i >= 0 && achars[i] == '0')
			{// 剩下的长的，能优化不？
				sb.append(c);
				c = '0';
			}
			else if (i > -1)
			{
				sb.append(c == '0' ? '1' : '0');
			}
			else
			{
				if (c == '1')
				{
					sb.append('1');
				}
			}
		}
		return sb.reverse().toString();// 倒转再转string
	}

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		AddBinary ab = new AddBinary();
		ab.addBinary("1010", "1011");
		ab.addBinary("11", "1");
	}

}
